package com.itheima.aspect;

import com.itheima.mapper.UserLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Aspect
@Slf4j
public class LogAspect {

    // 请为UserServiceImpl中的所有功能加入日志操作
    // 日志：定义一张表(user_log)：字段： id,操作类型(opt),操作时间(opt_time)

    // 模拟数据
    // id     opt      opt_time
    // 1      select    2000-02-02
    // 2      update    2000-02-02

    @Autowired
    private UserLogMapper userLogMapper;

    //抽取切入点表达式
    @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
    public void log_cuts() {
    }

    //(环绕)增强通知
    @Around("log_cuts()")
    public void logging(ProceedingJoinPoint p) throws Throwable {

        //被代理方法执行前无需任何操作

        //直接调用原始被代理的方法
        Object proceed = p.proceed();

        //被代理方法执行后开始添加日志

        log.info("开始向日志表中添加日志....");
        //获取方法名称
        Signature signature = p.getSignature();
        String name = signature.getName();
        log.info("日志方法名称：{}", name);

        String opt = "";

        if (name.startsWith("select")) {
            opt = "select";
        }

        if (name.startsWith("insert")) {
            opt = "insert";
        }

        if (name.startsWith("delete")) {
            opt = "delete";
        }

        if (name.startsWith("update")) {
            opt = "update";
        }

        //获取时间毫秒值
        long time = new Date().getTime();
        //向user_log表中添加日志
        userLogMapper.logging(opt, time);
    }
}
